package com.ocom.common.utils;

import com.google.gson.Gson;

import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用工具类
 *
 * @author pengchunfu 2021-10-08
 */
public class CommonUtil {
    private final static int SRV_ZERO = 0;

    /**
     * 判断字符串是否为空
     *
     * @param tmpStr 字符串
     * @return =true：空，=false：非空
     */
    public static boolean isNull(String tmpStr) {
        return (tmpStr == null || tmpStr.trim().length() == 0 || tmpStr.equals("null"));
    }


    public static String NulltoEmpty(String tmpStr){
        return tmpStr==null?"":tmpStr;
    }
    public static Integer NulltoEmpty(Integer tmpStr){
        return tmpStr==null?0:tmpStr;
    }
    /**
     * 获取系统当前日期时间(返回格式：yyyy-MM-dd HH:mm:ss)
     *
     * @return 当前日期时间
     */
    public static String getCurrentDate() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return formatter.format(currentTime);
    }

    /**
     * 获取系统当前日期(返回格式：yyyy-mm-dd)
     *
     * @return 当前日期
     */
    public static String getCurrentDateShort() {
        return getCurrentDateTime("yyyy-MM-dd");
    }

    /**
     * 获取系统当前日期时间(返回格式：yyyyMMddHHmmss)
     *
     * @return 当前日期时间
     */
    public static String getCurrentDateTime() {
        return getCurrentDateTime("yyyyMMddHHmmss");
    }

    /**
     * 获取系统当前日期时间(返回格式：yyyy-MM-dd HH:mm:ss)
     *
     * @param flag 标识
     * @return 当前日期时间
     */
    public static String getCurrentDateTime(int flag) {
        return getCurrentDateTime("yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 获取系统当前日期时间
     *
     * @param format 格式
     * @return 当前日期时间
     */
    public static String getCurrentDateTime(String format) {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat(format);
        return formatter.format(currentTime);
    }

    /**
     * 获取当前的年度
     *
     * @return 年度字符串
     */
    public static String getYear() {
        Calendar ca = Calendar.getInstance();
        int year = ca.get(Calendar.YEAR);
        return String.valueOf(year).trim();
    }

    /**
     * 添加指定的天数
     *
     * @param days    天数
     * @param current 指定日期(如果是空格，则为当前的日期)
     * @return
     */
    public static String addDays(int days, String current) {
        if (isNull(current)) {
            current = getCurrentDateShort();
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        Date currdate = null;
        try {
            currdate = format.parse(current);
        } catch (Exception e) {
            currdate = new Date();
        }
        Calendar ca = Calendar.getInstance();
        ca.setTime(currdate);
        ca.add(Calendar.DATE, days);
        return format.format(ca.getTime());
    }

    /**
     * 添加指定的时间
     *
     * @param hour    时间
     * @param current 指定日期(如果是空格，则为当前的日期)
     * @return
     */
    public static String addHours(int hour, String current) {
        if (isNull(current)) {
            current = getCurrentDateShort();
        }
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date currdate = null;
        try {
            currdate = format.parse(current);
        } catch (Exception e) {
            currdate = new Date();
        }
        Calendar ca = Calendar.getInstance();
        ca.setTime(currdate);
        ca.add(Calendar.HOUR_OF_DAY, hour);
        return format.format(ca.getTime());
    }

    /**
     * 转换字符串为整数
     *
     * @param tmpStr 数字型字符串
     * @return 整数(转换非法时 ， 返回0)
     */
    public static int convertToInt(String tmpStr) {
        int nVal = SRV_ZERO;
        try {
            nVal = Integer.parseInt(tmpStr);
        } catch (Exception e) {
            nVal = SRV_ZERO;
        }
        return nVal;
    }

    /**
     * 转换字符串对象为整数
     *
     * @param tmpStr （对象）
     * @return 整数(转换非法时 ， 返回0)
     */
    public static int convertToInt(Object tmpStr) {
        if (tmpStr == null) {
            return SRV_ZERO;
        }
        String data = tmpStr.toString().trim();
        if (data.length() == SRV_ZERO) {
            return SRV_ZERO;
        }
        return convertToInt(data);
    }

    /**
     * 转换字符串对象为浮点数
     *
     * @param tmpStr
     * @return
     */
    public static double convertToDouble(String tmpStr) {
        if (isNull(tmpStr)) {
            return SRV_ZERO;
        }
        double value = 0;
        try {
            value = Double.parseDouble(tmpStr);
        } catch (Exception e) {
            value = SRV_ZERO;
        }
        return value;
    }

    /**
     * 生成Reid编号
     *
     * @param lastReid 当前的reid
     * @param size     最大长度
     * @return 新编号
     */
    public static String generateReid(String lastReid, int size) {
        int ind = convertToInt(lastReid) + 1;
        String format = "%0" + Long.toString(size).trim() + "d";
        return String.format(format, ind);
    }

    /**
     * 获取UUID
     *
     * @return
     */
    public static String getUuid() {
        return UUID.randomUUID().toString();
    }

    /**
     * 获取一个随机序号
     *
     * @return
     */
    public static String getRegCode() {
        String regExt = "[^0-9]", result = "";
        Pattern p = Pattern.compile(regExt);
        do {
            String uuid = getUuid();
            String tmpStr = uuid.substring(uuid.lastIndexOf('-') + 1);
            Matcher matcher = p.matcher(tmpStr);
            result = matcher.replaceAll("").trim();
            if (result.length() > 8) {
                result = result.substring(0, 8);
            }
        } while (result.length() < 4);
        return result;
    }

    /**
     * 对象序列化为json字符串
     *
     * @param query 对象
     * @return json字符串
     */
    public static <TA> String serialize(TA query) {
        String tmpStr = "";
        try {
            Gson gson = new Gson();
            tmpStr = gson.toJson(query);
        } catch (Exception e) {
            //logger.error("序列化失败，msg=" + e.getMessage());
            tmpStr = "";
        }
        return (tmpStr != null ? tmpStr : "");
    }

    /**
     * 字符串反序列化对象
     *
     * @param jsonStr json字符串
     * @return TA对象列表
     */
    public static <TA> TA deSerialize(String jsonStr, Class<TA> type) {
        TA item;
        try {
            Gson gson = new Gson();
            item = gson.fromJson(jsonStr, type);
        } catch (Exception e) {
            item = null;
            //logger.error("反序列化失败，msg=" + e.getMessage() + ",str=" + jsonStr);
        }
        return (item == null ? null : item);
    }

    public static <TA> TA deSerialize(String jsonStr, Type type) {
        TA item;
        try {
            Gson gson = new Gson();
            item = gson.fromJson(jsonStr, type);
        } catch (Exception e) {
            item = null;
            //logger.error("反序列化失败，msg=" + e.getMessage() + ",str=" + jsonStr);
        }
        return (item == null ? null : item);
    }

    public static String encryptPhone(String phone) {
        if (phone == null || phone.length() != 11) {
            return phone; // 非11位号码直接返回原值（或根据需求抛异常）
        }
        return phone.substring(0, 3) + "****" + phone.substring(7);
    }

// 示例：13812345678 → 138****5678

    public static String encryptIdCard(String idCard) {
        if (idCard == null) return null;

        int len = idCard.length();
        // 处理15位旧身份证或18位新身份证
        if (len == 15 || len == 18) {
            return idCard.substring(0, 6) + "********" + idCard.substring(len - 4);
        }
        return idCard; // 非标准长度返回原值
    }

// 示例（18位）：110105199001011234 → 110105********1234
// 示例（15位）：110105900101123 → 110105*******1123

}
